package ttt;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.image.ImageObserver;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import utils.Imagenes;

/**
 *
 * @author Fénix
 */
public class Tablero implements ImageObserver {
	
	private static final int GANAN_X = -1;
	private static final int GANAN_Y = 1;
	private static final int EMPATE = 0;
	private static final int JUGANDOSE = 2;
	
	private Imagenes imagenes = null;
	private Map<String, Casilla> casillas = null;
	
	public Tablero(Imagenes imagenes) {
		casillas = new HashMap<String, Casilla>();
		
		casillas.put("UL", new Casilla("UL", Casilla.VACIA, 105,95));
		casillas.put("UC", new Casilla("UC", Casilla.VACIA, 236, 93));
		casillas.put("UR", new Casilla("UR", Casilla.VACIA, 351, 95));
		casillas.put("CL", new Casilla("CL", Casilla.VACIA, 97, 188));
		casillas.put("CC", new Casilla("CC", Casilla.VACIA, 230, 190));
		casillas.put("CR", new Casilla("CR", Casilla.VACIA, 373, 183));
		casillas.put("DL", new Casilla("DL", Casilla.VACIA, 92, 295));
		casillas.put("DC", new Casilla("DC", Casilla.VACIA, 236, 297));
		casillas.put("DR", new Casilla("DR", Casilla.VACIA, 368, 289));
		
		this.imagenes = imagenes;
		
	}
	
	private void dibujaTitulo(Graphics g) {
		g.drawImage(imagenes.getImagen("titulo"), 0, 25, this);
	}
	
	private void dibujarCasillas(Graphics g) {
		Iterator<String> it = (casillas.keySet()).iterator();
		
		while(it.hasNext()) {
			Casilla casilla = casillas.get(it.next());
			if (!(Casilla.VACIA).equals(casilla.getContenido())) {
				g.drawImage(imagenes.getImagen(casilla.getContenido()), casilla.x, casilla.y, this);
			}
		}
	}
	
	public void dibujarFicha(Graphics g, String name, String posicion) {
		Casilla casilla = casillas.get(posicion);
		casilla.setContenido(name);
		g.drawImage(imagenes.getImagen(name), casilla.x, casilla.y, this);
	}
	
	public void dibujar(Graphics g) {
		g.drawImage(imagenes.getImagen("tablero"), 0, 25, this);
		this.dibujarCasillas(g);
		this.dibujaTitulo(g);
	}
	
	public void limpiaTablero() {
		Iterator<String> it = (casillas.keySet()).iterator();
		
		while(it.hasNext()) {
			String coord = it.next();
			casillas.get(coord).setContenido(Casilla.VACIA);
		}
	}
	
	
	public boolean dibujarFicha(Graphics g, String name, Point point) {
		Iterator<String> it = (casillas.keySet()).iterator();
		boolean dibujado = false;
		
		while(it.hasNext() && !dibujado) {
			String coord = it.next();
			Casilla casilla = casillas.get(coord);
			if (point.x >= casilla.x && point.x <= casilla.x+85 && point.y >= casilla.y && point.y <= casilla.y + 82) {
				//Comprobamos si ya hay una ficha puesta en esa casilla.
				if (Casilla.VACIA.equals(casilla.getContenido())) {
					this.dibujarFicha(g, name, coord);
					dibujado = true;
				}
			}
		}
		
		return dibujado;
	}
	
	public void rellenarTodo(Graphics g, String name) {
		Iterator<String> it = (casillas.keySet()).iterator();
		
		while(it.hasNext()) {
			this.dibujarFicha(g, name, it.next());
		}
	}
	
	public List<Casilla> getCasillasLibres() {
		List<Casilla> casillasVacias = new ArrayList<Casilla>();
		
		Iterator<String> it = (casillas.keySet()).iterator();
		while(it.hasNext()) {
			Casilla casilla = casillas.get(it.next());
			if (casilla.getContenido().equals(Casilla.VACIA)) {
				casillasVacias.add(casilla);
			}
		}
		
		return casillasVacias;
		
	}
	
	/* Comprueba la situación del tablero:
	 *
	 * Devuelve:
	 *		-1: equis ganan.
	 *		 0: empate.
	 *		 1: ceros ganan. 
	*/
	public int compruebaTablero() {
		
		int ganador = Tablero.JUGANDOSE;
		
		if (!casillas.get("UL").getContenido().equals(Casilla.VACIA) &&
			casillas.get("UL").getContenido().equals(casillas.get("UC").getContenido()) &&
			casillas.get("UL").getContenido().equals(casillas.get("UR").getContenido())) {
			
			ganador = casillas.get("UL").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (!casillas.get("CL").getContenido().equals(Casilla.VACIA) &&
				casillas.get("CL").getContenido().equals(casillas.get("CC").getContenido()) &&
				casillas.get("CL").getContenido().equals(casillas.get("CR").getContenido())) {
		
			ganador = casillas.get("CL").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (!casillas.get("DL").getContenido().equals(Casilla.VACIA) &&
				casillas.get("DL").getContenido().equals(casillas.get("DC").getContenido()) &&
				casillas.get("DL").getContenido().equals(casillas.get("DR").getContenido())) {
				
			ganador = casillas.get("DL").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (!casillas.get("UL").getContenido().equals(Casilla.VACIA) &&
				casillas.get("UL").getContenido().equals(casillas.get("CC").getContenido()) &&
				casillas.get("UL").getContenido().equals(casillas.get("DR").getContenido())) {
			
			ganador = casillas.get("UL").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (!casillas.get("UR").getContenido().equals(Casilla.VACIA) &&
				casillas.get("UR").getContenido().equals(casillas.get("CC").getContenido()) &&
				casillas.get("UR").getContenido().equals(casillas.get("DL").getContenido())) {
		
			ganador = casillas.get("UR").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if(!casillas.get("UR").getContenido().equals(Casilla.VACIA) &&
				casillas.get("UR").getContenido().equals(casillas.get("CR").getContenido()) &&
				casillas.get("UR").getContenido().equals(casillas.get("DR").getContenido())) {
		
			ganador = casillas.get("UR").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (!casillas.get("UC").getContenido().equals(Casilla.VACIA) &&
				casillas.get("UC").getContenido().equals(casillas.get("CC").getContenido()) &&
				casillas.get("UC").getContenido().equals(casillas.get("DC").getContenido())) {
				
			ganador = casillas.get("UC").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (!casillas.get("UL").getContenido().equals(Casilla.VACIA) &&
				casillas.get("UL").getContenido().equals(casillas.get("CL").getContenido()) &&
				casillas.get("UL").getContenido().equals(casillas.get("DL").getContenido())) {
				
			ganador = casillas.get("UL").getContenido().equals(Casilla.X)?Tablero.GANAN_X:Tablero.GANAN_Y;
		} else if (getCasillasLibres().size() == 0) {
				ganador = Tablero.EMPATE;
		}
		
		return ganador;
	}
	
	public String getContenidoCasilla(String codigo) {
		return casillas.get(codigo).getContenido();
	}

	public boolean imageUpdate(Image arg0, int arg1, int arg2, int arg3, int arg4, int arg5) {
		return true;
	}
	
}
